home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 151-175 / 169 / src / shell / main.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  3KB  |  137 lines

  1.  
  2. /*
  3.  * MAIN.C
  4.  *
  5.  *  (C)Copyright 1987 Matthew Dillon, All rights reserved
  6.  *
  7.  *  Contains initialization and other stuff.  Note that there is no
  8.  *  support for workbench startup.  This isn't simply a matter of
  9.  *  setting up a window.... to get this baby to work from workbench we
  10.  *  would need to simulate an entire CLI (proc->pr_CLI must be valid).
  11.  *
  12.  */
  13.  
  14. #include "shell.h"
  15. #include <libraries/dosextens.h>
  16. #include <stdio.h>
  17.  
  18. extern long SetSignal();
  19.  
  20. char Inline[256];
  21. static long Orig_dir;
  22.  
  23. extern int Enable_Abort;
  24.  
  25. main(argc, argv)
  26. short argc;
  27. register char *argv[];
  28. {
  29.     char *prompt;
  30.     struct Process *proc;
  31.     register short i;
  32.  
  33.     Enable_Abort = 0;
  34.     proc = (PROC *)FindTask(0);
  35.     if (proc->pr_CLI == NULL)              /* sorry, no WB startup */
  36.     exit(1000);
  37.     Orig_dir = proc->pr_CurrentDir;
  38.     CurrentDir(DupLock(Orig_dir));
  39.     init_vars();
  40.     init();
  41.     seterr();
  42.     do_cd(NULL, -1);
  43.     for (i = 1; i < argc; ++i) {
  44.     if (strcmp(argv[i], "-c") == 0) {
  45.         Inline[0] = '\0';
  46.         for (++i; i < argc; ++i) {
  47.         if (*argv[i] == '\"') {             /* CLI quotes?   */
  48.             strcat(Inline, argv[i]+1);       /* remove quotes */
  49.             Inline[strlen(Inline)-1] = '\0';
  50.         } else {
  51.             strcat(Inline, argv[i]);
  52.         }
  53.         if (i + 1 < argc)
  54.             strcat(Inline, " ");
  55.         }
  56.         exec_command(Inline);
  57.         main_exit(0);
  58.     }
  59.     strcpy (Inline, "source ");
  60.     strcat (Inline, argv[i]);
  61.     av[0] = "source";
  62.     av[1] = argv[i];
  63.     do_source (Inline, 0);
  64.     }
  65.     for (;;) {
  66.     if ((prompt = get_var (LEVEL_SET, V_PROMPT)) == NULL)
  67.         prompt = "echo -n \"% \"";
  68.     /*
  69.      *
  70.      *  Removed, WaitForChar() is buggy
  71.      *
  72.     if (CHECKBREAK()) {
  73.         while (WaitForChar(Input(), 10))
  74.         gets(Inline);
  75.     }
  76.      */
  77.  
  78.     ++H_stack;
  79.     ++Exec_ignoreresult;
  80.     exec_command (prompt);
  81.     --Exec_ignoreresult;
  82.     --H_stack;
  83.     if (Quit)
  84.         main_exit(0);
  85.     if (gets(Inline) == NULL) {
  86.         if (IsInteractive(Input()) && !S_ignoreeof)
  87.         main_exit(0);
  88.         clearerr(stdin);
  89.     }
  90.     resetbreak();
  91.     if (*Inline == '^')
  92.         hat_replace(Inline);
  93.     if (*Inline)
  94.         exec_command(Inline);
  95.     }
  96. }
  97.  
  98. init_vars()
  99. {
  100.     if (IsInteractive(Input()))
  101.     set_var (LEVEL_SET, V_PROMPT, "echo -n \"% \"");
  102.     else
  103.     set_var (LEVEL_SET, V_PROMPT, "");
  104.     set_var (LEVEL_SET, V_HIST, "20");
  105.     set_var (LEVEL_SET, V_PATH, "ram:,ram:c/,c:,df2:c/,df1:c/,df0:c/");
  106. }
  107.  
  108. init()
  109. {
  110.     static char pipe1[32], pipe2[32];
  111.  
  112.     Cin = Input();
  113.     Cout= Cerr = Output();
  114.     Uniq= (long)pipe1;         /* address of some global variable */
  115.     Pipe1 = pipe1;
  116.     Pipe2 = pipe2;
  117.     sprintf (pipe1, "ram:pipe1_%ld", Uniq);
  118.     sprintf (pipe2, "ram:pipe2_%ld", Uniq);
  119. }
  120.  
  121. main_exit(n)
  122. {
  123.     UnLock(CurrentDir(Orig_dir));
  124.     do_cldres();
  125.     exit (n);
  126. }
  127.  
  128. docheckbreak()
  129. {
  130.     if (checkbreak()) {
  131.     printf("^C\n");
  132.     return(1);
  133.     }
  134.     return(0);
  135. }
  136.  
  137.